from flask import Flask,render_template
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Map, EffectScatter, HeatMap, Line,Grid,Geo
from pyecharts.faker import Faker
from pyecharts.globals import SymbolType
from pyecharts.charts import Pie,Bar,Pie,WordCloud
import random
from calendar import c
from tkinter import Grid
from pyecharts.commons.utils import JsCode
import re
import collections
import jieba

app = Flask(__name__)


@app.route('/')
def first_page() -> 'html':
    df = pd.read_csv('data/data1.csv')
    a = (
        Map()
            .add("平均月薪", list(zip(df.省, df.平均月薪)), "china")
            .set_global_opts(
            title_opts=opts.TitleOpts(title="各省python相关岗位平均月薪", subtitle="平均月薪前四位分别是吉林、北京、上海、广东"),
            visualmap_opts=opts.VisualMapOpts(min_=7164.08, max_=17096.07),
        )
    )
    a.render('templates/各省平均月薪分布地图.html')
    df_all = df.to_html()
    with open("templates/各省平均月薪分布地图.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    return render_template('base.html',
                           the_plot_all=plot_all,
                           data=df_all,
                           the_title='各省平均月薪分布地图')

@app.route('/map2', methods=['GET'])
def map_page() -> 'html':
    df = pd.read_csv('data/data1.csv')
    a = (
        Map()
            .add("岗位数量", list(zip(df.省, df.数量)), "china")
            .set_global_opts(
            title_opts=opts.TitleOpts(title="各省python相关岗位数量分布", subtitle="平均月薪前三位分别是北京、上海、广东"),
            visualmap_opts=opts.VisualMapOpts(min_=60, max_=5000, is_piecewise=True),
        )
    )
    a.render('templates/各省岗位数量分布图.html')
    df_all = df.to_html()
    with open("templates/各省岗位数量分布图.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    return render_template('base.html',
                           the_plot_all=plot_all,
                           data=df_all,
                           the_title='各省岗位数量分布图')


@app.route('/pie', methods=['GET'])
def pie_page() -> 'html':
    df3 = pd.read_csv('data/data3.csv', encoding='utf8')
    df3.drop(labels='职位数量', axis=1)

    x_data = df3['最低学历'].tolist()
    y_data = df3['学历百分比'].tolist()
    data_pair = [list(z) for z in zip(x_data, y_data)]
    data_pair.sort(key=lambda x: x[1])

    pie = (
        Pie(init_opts=opts.InitOpts(width="800px", height="400px", bg_color="#2c343c"))
            .add(
            series_name="学历占比",
            data_pair=data_pair,
            rosetype="radius",
            radius="55%",
            center=["50%", "50%"],
            label_opts=opts.LabelOpts(is_show=False, position="center"),
        )
            .set_global_opts(
            title_opts=opts.TitleOpts(
                title="不同学历占比对比图",
                subtitle='由图可以看出岗位需求本科以上占比比较多',
                pos_left="center",
                pos_top="20",
                title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
            .set_series_opts(
            tooltip_opts=opts.TooltipOpts(
                trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
            ),
            label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"),
        )

    )
    pie.render('templates/学历占比图.html')
    df3_all = df3.to_html()
    with open("templates/学历占比图.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    return render_template('base.html',
                           the_plot_all=plot_all,
                           data=df3_all,
                           the_title='不同学历占比图')

@app.route('/bar', methods=['GET'])
def bar_page() -> 'html':
    df3 = pd.read_csv('data/data3.csv', encoding='utf8')
    df3.drop(labels='职位数量', axis=1)

    # 设置颜色
    color_function = """
            function (params) {
                if (params.value < 3000) 
                    return '#66cc98';
                else return '#009999';
            }
            """

    bar = (
        Bar()
            .add_xaxis(['不限', '3-5年', '1-3年', '5-10年', '无经验', '一年以下'])
            .add_yaxis("职位数量", y_axis=df3['数量'].tolist(),
                       itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_function)))

            .set_global_opts(title_opts=opts.TitleOpts(title="工作经验-职位分布数量",
                                                       subtitle='由图表可以看出：\n\n不限工作经验的岗位数量比较多。\n\n但是无工作经验的岗位数量比较少，所以为了更好地吸引人才应聘，放宽经验要求，但实则还是存在的',
                                                       title_textstyle_opts=opts.TextStyleOpts(), pos_left="50%",
                                                       pos_top="0",),
              legend_opts=opts.LegendOpts(orient="vertical", pos_top="35%", pos_right="0%"),
          )

    )
    line = (
        Line()
            .add_xaxis(['不限', '3-5年', '1-3年', '5-10年', '无经验', '一年以下', '10年以上'])  # x轴
            .add_yaxis("职位数量", y_axis=df3['数量'].tolist(), color=["yellow"])
            .set_series_opts(label_opts=opts.LabelOpts(is_show=False))

    )

    bar.overlap(line).render('templates/工作经验与岗位分布情况.html')
    df3_all = df3.to_html()
    with open("templates/工作经验与岗位分布情况.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    return render_template('base.html',
                           the_plot_all=plot_all,
                           data=df3_all,
                           the_title='工作经验与岗位分布情况')


@app.route('/wordcloud', methods=['GET'])
def wordcloud_page() -> 'html':
    df5 = pd.read_excel('data/data5.xlsx', encoding='utf8')
    # 提取指定岗位的数据
    # 注意：岗位类别需要处理空字符问题，岗位类别后都有一个空格，要去除空格才能读出来
    # 去除空格
    A = df5['welfare'].str.strip()
    df5['welfare'] = A

    # 拼接所有福利待遇类别
    string_data = ''
    for i in df5['welfare']:
        string_data += str(i)

    # 2.文本预处理，去除各种标点符号，不然统计词频时会统计进去
    # 定义正则表达式匹配模式，其中的|代表或
    pattern = re.compile(u'\t|\n| |；|\.|。|：|：\.|-|:|\d|;|、|，|\)|\(|\?|"')
    # 将符合模式的字符去除，re.sub代表替换，把符合pattern的替换为空
    string_data = re.sub(pattern, '', string_data)

    # 3.文本分词
    seg_list_exact = jieba.cut(string_data, cut_all=False)  # 精确模式分词
    # object_list  = list(seg_list_exact) # list()函数可以把可迭代对象转为列表

    # 4.运用过滤词表优化掉常用词，比如“的”这些词，不然统计词频时会统计进去
    object_list = []

    # 读取过滤词表
    with open('./remove_words.txt', 'r', encoding="utf-8") as fp:
        remove_words = fp.read().split()

    # 循环读出每个分词
    for word in seg_list_exact:
        # 看每个分词是否在常用词表中或结果是否为空或\xa0不间断空白符，如果不是再追加
        if word not in remove_words and word != ' ' and word != '\xa0':
            object_list.append(word)  # 分词追加到列表

    # 5.进行词频统计，使用pyecharts生成词云
    # 词频统计
    word_counts = collections.Counter(object_list)  # 对分词做词频统计
    word_counts_top = word_counts.most_common(100)  # 获取前100最高频的词

    # 6.绘图
    c = (
        WordCloud()
            .add("福利待遇分析", word_counts_top)  # 根据词频最高的词
            .set_global_opts(
            title_opts=opts.TitleOpts(
                title="福利待遇分析",
                subtitle='关于工作的福利待遇基本都是给出五险一金、绩效奖金、专业培训等',
                title_textstyle_opts=opts.TextStyleOpts(font_size=23)
            ),
            tooltip_opts=opts.TooltipOpts(is_show=True),

        ))

    c.render('templates/福利待遇词云图.html')
    df5_all = df5.to_html()
    with open("templates/福利待遇词云图.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    return render_template('base.html',
                           the_plot_all=plot_all,
                           data=df5_all,
                           the_title='福利待遇情况分析')



@app.route('/wordcloud2', methods=['GET'])
def wordcloud_page2() -> 'html':
    data6 = pd.read_excel('data/work_all.xlsx')

    A = data6['岗位类别'].str.strip()
    # 把去除空格后的数据更改到原数据中
    data6['岗位类别'] = A

    '''
    把属于数据运营、机器学习、数据科学、数据分析师、数据产品经理、商业数据分析的数据筛选出来，
    并把其'岗位类别'列中的值全部替换为'数据科学'。
    '''
    # 把属于这些类别的提取出来放到B中
    B = A.isin(['数据运营', '机器学习', '数据科学', '数据分析师', '数据产品经理', '商业数据分析'])
    # 把这些岗位的类别都替换为数据科学
    data6.loc[B, '岗位类别'] = '数据科学'

    # 提取岗位类别为数据科学的数据
    res = data6[data6['岗位类别'] == '数据科学']
    # 更改到原数据中
    data_cy = res

    # 拼接所有岗位类别为数据科学的岗位描述
    string_data = ''
    for i in data6['岗位描述']:
        string_data += str(i)

    # 文本预处理，去除各种标点符号，不然统计词频时会统计进去
    # 定义正则表达式匹配模式，其中的|代表或
    pattern = re.compile(u'\t|\n| |；|\.|。|：|：\.|-|:|\d|;|、|，|\)|\(|\?|"')
    # 将符合模式的字符去除，re.sub代表替换，把符合pattern的替换为空
    string_data = re.sub(pattern, '', string_data)

    # 文本分词
    seg_list_exact = jieba.cut(string_data, cut_all=False)  # 精确模式分词
    # object_list  = list(seg_list_exact) # list()函数可以把可迭代对象转为列表

    # 运用过滤词表优化掉常用词，比如“的”这些词，不然统计词频时会统计进去
    object_list = []

    # 读取过滤词表
    with open('./remove_words.txt', 'r', encoding="utf-8") as fp:
        remove_words = fp.read().split()

    # 循环读出每个分词
    for word in seg_list_exact:
        # 看每个分词是否在常用词表中或结果是否为空或\xa0不间断空白符，如果不是再追加
        if word not in remove_words and word != ' ' and word != '\xa0':
            object_list.append(word)  # 分词追加到列表

    # 词频统计
    word_counts = collections.Counter(object_list)  # 对分词做词频统计
    word_counts_top = word_counts.most_common(100)  # 获取前100最高频的词

    cl = (
        WordCloud()
            .add("岗位描述", word_counts_top)  # 根据词频最高的词
            .set_global_opts(
            title_opts=opts.TitleOpts(
                title="岗位描述分析",
                title_textstyle_opts=opts.TextStyleOpts(font_size=23)
            ),
            tooltip_opts=opts.TooltipOpts(is_show=True),

        )
    )

    cl.render('templates/技能需求词云图.html')
    df6_all = data6.to_html()
    with open("templates/技能需求词云图.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    return render_template('base.html',
                           the_plot_all=plot_all,
                           data=df6_all,
                           the_title='岗位相关描述')


if __name__ == '__main__':
    app.run(debug=True)
